#include <iostream>
#include <new>
#include <cstdlib>
using namespace std;


// Terzo esempio per creare costruttori di copie
// N.B. quando si esegue una copia i due oggetti sono identici bit a bit,
// quando perņ la inizializzazione comporta l'allocazione di memoria non deve
// essere fatta una copia bit a bit 

// Questo programma crea una classe per array "sicuri"


class vettore
{
	int *p;
	int dimensione;
	public:
	vettore (int dim)
		{
			cout<<"costruzione"<<endl;
			p=new int[dim];
			dimensione=dim;
		}

	~vettore() {delete [] p;cout<<"distruzione"<<endl;}
	// costruttore di copie
	vettore(const vettore &vett);

	void imposta (int i, int j)
	{
		if(i>=0 && i <dimensione)
			p[i]=j;
	}

	int prendi(int i)
	{
		return p[i];
	}
};

// Costruttore di copie

vettore::vettore(const vettore &vett)
{
int i;
p=new int[vett.dimensione];
cout<<"costruttore di copie"<<endl;
for (i=0;i<vett.dimensione;i++)
p[i]= vett.p[i];
}


int main()
{
vettore num(10);
int i;
for(i=0;i<10;i++) num.imposta(i,i);
for(i=9;i>=0;i--) cout << num.prendi(i);
cout <<"\n";

// i vettori num e x contengono gli stessi valori ma ciascun vettore
// si trova in aree diverse di memoria

// crea un altro vettore e lo inizializza con num
vettore x(num); // richiama il costruttore di copie;
for(i=0;i<10;i++) cout << num.prendi(i);
cout <<"\n";
return 0;
}

/*
costruzione
9876543210
costruttore di copie
0123456789
distruzione
distruzione
Press any key to continue
*/